import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

/**
 * CreateImg 用于生成验证码图片
 */

public class CreateImg {
    // 验证码的字符集
    public static char[] strs = "abcdefghijklmnopqrstuvwxyzABCDEFJHIGKLMNOPQRSTUVWXYZ11234567890".toCharArray();
/**
 * getImage 方法的参数是图片的路径，返回值是验证码的字符串
 * @param path 图片的路径
 * 返回值是验证码的字符串
 * 生成的图片放在path中
 */
    public String getImage(String path) throws IOException {
            String str = "";
            // 验证码的长度
            int w = 150;
            // 验证码的高度
            int h = 50;
            // 验证码的随机数对象
            Random random = new Random();
            // 验证码的图片对象
            BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
            // 验证码的画笔对象
            Graphics2D g = (Graphics2D) image.getGraphics();
            // 验证码的画笔对象的颜色
            g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
            //背景颜色的填充
            g.fillRect(0, 0, w, h);

            // ===========================================================================
            // 验证码的随机数对象的随机数的字符的坐标
            int x = 30;
            // 验证码的随机数对象的随机数的字符的坐标
            int y = 35;

            for (int i = 0; i < 4; i++) {
                // 验证码的随机数对象的随机数
                int index = random.nextInt(strs.length);
                // 验证码的随机数对象的随机数的字符
                char c = strs[index];
                // 验证码的画笔对象的颜色
                g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
                // 验证码的画笔对象的字体
                g.setFont(new Font("Fira Code", Font.BOLD, 30 + random.nextInt(10)));

                // 验证码的画笔对象的字体的角度
                int jd = random.nextInt(90) - 45;
                // 验证码的画笔对象的字体的角度的弧度
                double hd = jd * Math.PI / 180;
                // 验证码的画笔对象的字体的角度的弧度的正弦
                g.rotate(hd, x, y);
                // 验证码的画笔对象的字体的颜色
                g.drawString(c + "", x, y);
                g.rotate(-hd, x, y);
                str += c;
                x += 25;
            }
            //随机生成干扰线
            for (int i = 0; i < random.nextInt(7); i++) {
                g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
                g.drawLine(random.nextInt(20), random.nextInt(50), random.nextInt(150), random.nextInt(50));   //画一条线
            }
            // 验证码的画笔对象
            ImageIO.write(image, "jpg", new File(path));
            return str;
    }
}
